"""
@Author  : 康帅
@Time    : 2021/3/18 10:24
@Function: 代理模式基类（包裹代理）
"""
from abc import ABCMeta, abstractmethod

"""
主题（Subject）：定义操作、活动、任务的接口类。
真实主题（RealSubject）：真正完成操作、活动、任务的具体类。
代理主题（ProxySubject）：代替真实主题完成操作、活动、任务的代理类。
"""


class Subject(metaclass=ABCMeta):
    """ 主题类 """

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    @abstractmethod
    def request(self, content=''):
        pass


class RealSubject(Subject):
    """ 真实主题类 """

    def request(self, content=''):
        print("RealSubject todo something...")


class ProxySubject(Subject):
    """ 代理主题类 """

    def __init__(self, name, subject):
        super().__init__(name)
        self._real_subject = subject

    def request(self, content=''):
        self.pre_request()
        if self._real_subject is not None:
            self._real_subject.request(content)
        self.after_request()

    def pre_request(self):
        print("pre_request")

    def after_request(self):
        print("after_request")


if __name__ == '__main__':
    real_obj = RealSubject('RealSubject')
    proxy_subject = ProxySubject('ProxySubject', real_obj)
    proxy_subject.request()
